import re
#返回的result是一个匹配对象，要想拿到匹配的内容，还需要使用匹配对象方法
#match必须从头开始匹配到，search可以在中间匹配到，两者都是得到匹配对象
#而findall是返回所有匹配到的字符串输出到列表中，得到的是一个列表

# 1.可以看到search和match区别，\w使用，匹配字母、数字、下划线,\W匹配非字符、数字、下划线
pattern = re.compile('\w\d{2,16}$')
result = re.search(pattern,'ab522')
result1 = re.match(pattern,'ab522')
print(result)
print(result1)

# 2.使用[]，匹配中括号中的其中一个字符
pattern = re.compile('r[au]b')
result = re.search(pattern,'r1b rab')
print(result)

# 3.使用findall，从前往后匹配，会把所有匹配到的以列表的形式展示出来，匹配数字，使用\d和\D
# \d匹配数字，\D匹配非数字
pattern = re.compile('r\d*b')
result = re.findall(pattern,'r3b34rb')
print(result)

# 4.匹配空白 \s和\S \s匹配换行\n,回车\r,换页\f,制表符\t,\S是匹配非空白
pattern = re.compile('r\s*b')
result = re.search(pattern,'r\n\tb34rb')
result1 = re.findall(pattern,'r\n\tb34rb')
print(result)
print(result1)

# 5.替换匹配内容 sub
pattern = re.compile('r\d*b')
result = re.sub(pattern,'love','r3b34rb')
print(result)

# 6.分裂内容split
pattern = re.compile(r'[ ,;.\\ ]')
result = re.split(pattern,'a,b;c.d\m')
print(result)

# 7.匹配后group组输出,group以字符串形式输出，groups依据正则里的分组以元组形式输出各个分组匹配到的内容
pattern = re.compile('ID:(\d+),Name:(.+)')
result = re.search(pattern,'ID:12343,Name:a我')
print(result)  #<re.Match object; span=(0, 16), match='ID:12343,Name:a我'>
print(result.group()) #ID:12343,Name:a我
print(type(result.group())) #<class 'str'>
print(result.group(1)) #12343
print(result.group(2)) #a我
print(result.groups()) #('12343', 'a我')

# 8.给group组命名 ?P<name>
pattern = re.compile('ID:(?P<id>\d+),Name:(?P<name>.+)')
result = re.search(pattern,'ID:12343,Name:a我')
print(result.group('id')) #12343
print(result.group('name')) #a我
print('*'*15)

# 9.验证密码案例，密码(以字母开头，长度在6-18之间，只能包含字母、数字、下划线)
pwd_list = ['1sfkdbsf','@sfksf我','askdfk']
pwd_pass = []
pattern = re.compile('^[a-zA-Z]\w{5,17}$')
for pwd in pwd_list:
    result = re.match(pattern,pwd)
    print(result)
    print(type(result))
    if result != None:
        pwd_pass.append(result.group())
print(pwd_pass)
print(type(pwd_pass))









